
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Maven多模块项目的依赖管理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Maven多模块项目的依赖管理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Maven多模块项目在软件架构中处于什么样的定位？它旨在解决什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Maven多模块项目是介于单体架构与微服务架构之间的平衡点。它通过“内部拆分”的方式，允许在保持代码高内聚的同时实现逻辑分层和功能解耦，从而使复杂系统易于管理，同时避免了微服务带来的分布式复杂性。</div>
          </div>
          <div class="card-source">来源: 一、多模块项目的核心价值 > 1. 多模块项目的定位</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当Maven项目中出现依赖冲突时，它主要遵循哪两个原则来决定使用哪个版本的依赖？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Maven解决依赖冲突主要遵循两个原则：1. 最短路径优先，即项目更直接依赖的版本会被优先选择；2. 声明顺序优先，即在依赖路径长度相同的情况下，POM文件中先声明的依赖会被优先选择。</div>
          </div>
          <div class="card-source">来源: 二、Maven依赖管理的基础机制 > 2. 依赖冲突的产生与解决</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在父POM中，<dependencyManagement>标签的核心作用是什么？它与直接在<dependencies>中声明依赖有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer"><dependencyManagement>的核心作用是在父POM中集中声明依赖的版本号，但并不会实际引入这些依赖。子模块在需要使用这些依赖时，只需声明groupId和artifactId，无需指定版本。这与直接在<dependencies>中声明不同，后者会立即将依赖引入到当前模块。</div>
          </div>
          <div class="card-source">来源: 三、父子工程的POM配置 > 2. dependencyManagement与pluginManagement深度解析</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Maven多模块项目中的继承（Inheritance）和聚合（Aggregation）有何区别与联系？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">继承是指子模块通过`<parent>`标签继承父模块的配置信息。聚合是指父模块通过`<modules>`标签将多个子模块组织在一起，以便可以一次性构建所有模块。在实践中，一个父POM通常同时扮演继承和聚合的角色。</div>
          </div>
          <div class="card-source">来源: 三、父子工程的POM配置 > 1. 继承与聚合的区别与应用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在设计一个高效的多模块项目时，进行模块划分应遵循哪些核心原则？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">有效的模块划分应遵循四个核心原则：1. 按业务领域划分（如用户、订单）；2. 按技术层次划分（如API、Service、DAO）；3. 按共享程度划分（如通用工具、特定业务）；4. 遵循单一职责原则，确保每个模块有明确的职责。</div>
          </div>
          <div class="card-source">来源: 四、构建高效的多模块项目结构 > 1. 模块划分的原则与方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">如何设计系统架构来避免Maven多模块项目中的循环依赖问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">避免循环依赖的解决方案主要有三种：1. 将共享的接口抽取到一个独立的模块中；2. 使用设计模式（如观察者模式）来解耦模块间的直接依赖；3. 重新审视模块划分，调整职责边界，确保依赖关系是单向的。</div>
          </div>
          <div class="card-source">来源: 四、构建高效的多模块项目结构 > 4. 避免循环依赖的架构设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请解释Maven中`provided`和`test`这两种依赖作用域（scope）的用途和区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`provided`作用域表示依赖在编译和测试时需要，但在运行时由容器（如Servlet容器）提供，因此不会被打包。`test`作用域表示依赖仅在测试编译和执行阶段需要，不会被打包，也不会参与主代码的编译和运行。</div>
          </div>
          <div class="card-source">来源: 二、Maven依赖管理的基础机制 > 3. 依赖作用域的正确使用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当遇到`NoClassDefFoundError`错误时，通常是什么原因导致的，并应如何排查？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该错误的原因是在运行时找不到编译时存在的类。排查方法是检查相关依赖的`scope`是否正确（例如，不应是`provided`或`test`），并确认该依赖是否被其他依赖通过`<exclusion>`标签错误地排除了。</div>
          </div>
          <div class="card-source">来源: 五、依赖优化与问题排查 > 3. 常见依赖问题的诊断与修复</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在CI/CD流程中，如何利用Maven命令来提升多模块项目的构建效率？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过两种方式提升构建效率：1. 使用`-pl`参数进行增量构建，只构建指定的模块及其依赖（配合`-am`），例如`mvn clean install -pl module1 -am`。2. 使用`-T`参数开启并行构建，利用多核CPU加速构建过程，例如`mvn clean install -T 1C`。</div>
          </div>
          <div class="card-source">来源: 六、CI/CD中的多模块项目实践 > 1. 多模块项目的增量构建策略 & 2. 模块并行构建提升效率</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
